package com.gradumate.server.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;

import com.gradumate.server.PMF;
import com.gradumate.shared.LoginToken;

/**
 * DAO klasse die data uit de DataStore haalt
 * 
 * @author Hugo Zonderland
 *
 */
public class LoginToken_DAO {
	
	// logger
	private final Logger log = Logger.getLogger(LoginToken_DAO.class.getName());
	
	/**
	 * Haalt een LoginToken op uit de DS a.d.v. token en gebruiker email
	 * 
	 * @param String token
	 * @param String gebruikerEmail
	 * @return return LoginToken
	 */
	public LoginToken getLoginTokenByTokenAndEmail(String token, String gebruikerEmail) {
		
		// Wanneer een van beiden leeg, null returnen
		if (token == null || gebruikerEmail == null) {
			return null;
		}

		LoginToken lt = null;

		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "SELECT FROM " + LoginToken.class.getName() + " WHERE gebruikerEmail == \"" + gebruikerEmail + "\" && token == \"" + token + "\"";
		ArrayList<LoginToken> tokens = new ArrayList<LoginToken>(pm.detachCopyAll((List<LoginToken>) pm.newQuery(query).execute()));

		tokens.size();
		pm.close();

		if (tokens != null && !tokens.isEmpty()) {
			lt = tokens.get(0);
			log.info("getLoginTokenByTokenAndEmail(" + token + ", " + gebruikerEmail + ") | LoginToken: " + lt.toString());
		} else {
			log.info("Geen logintokens gevonden met: " + token + " " + gebruikerEmail);
		}

		log.info("getLoginTokenByTokenAndEmail(" + token + ", " + gebruikerEmail + ")");

		return lt;
	}
	
	/**
	 * Slaat een LoginToken object op
	 * @param LoginToken lt
	 * @return true wanneer gelukt, anders false
	 */
	public boolean addLoginToken(LoginToken lt) {
		LoginToken logintoken = getLoginTokenByTokenAndEmail(lt.getToken(), lt.getGebruikerEmail());
		if (logintoken == null) {
			PersistenceManager pmWrite = PMF.get().getPersistenceManager();
			try {
				pmWrite.makePersistent(lt);
			} finally {
				pmWrite.close();
			} 
		} 

		log.info("addLoginToken(" + lt.toString() + ")");

		return lt == null;
	}
	
	/**
	 * Verwijderd een LoginToken uit de Datastore
	 * @param LoginToken loginToken de token die verwijderd moet worden
	 * @return
	 */
	public boolean deleteLoginToken(LoginToken loginToken) {
		boolean b = false;
		LoginToken lt = getLoginTokenByTokenAndEmail(loginToken.getToken(), loginToken.getGebruikerEmail());
		if (lt != null) {
			try {
				PersistenceManager pm = PMF.get().getPersistenceManager();
				pm.deletePersistent(lt);
				b = true;
			} catch (Exception ex) {
				System.out.println(ex.getMessage());
				ex.printStackTrace();
			}
		}

		log.info("deleteLoginToken(" + loginToken.toString() + ") | is verwijderd: " + b);

		return b;
	}
}
